package com.itheima.pinda.file.strategy.impl;

import com.itheima.pinda.exception.BizException;
import com.itheima.pinda.exception.code.ExceptionCode;
import com.itheima.pinda.file.domain.FileDeleteDO;
import com.itheima.pinda.file.entity.File;
import com.itheima.pinda.file.enumeration.IconType;
import com.itheima.pinda.file.strategy.FileStrategy;
import com.itheima.pinda.file.utils.FileDataTypeUtil;
import com.itheima.pinda.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.util.List;

/**
    抽象文件策略
 */
@Slf4j
public abstract class AbstractFileStrategy implements FileStrategy{
    private static final  String FILE_SPLIT=".";
    @Override
    public File upload(MultipartFile multipartFile) {
        try {
            //获得上传文件的原始文件名称
            String originalFilename = multipartFile.getOriginalFilename();
            if(!originalFilename.contains(FILE_SPLIT)){
                //文件名称没有.这是非法的,直接抛出异常
                throw BizException.wrap(ExceptionCode.BASE_VALID_PARAM.build("上传文件名称缺少后缀"));
            }
            //封装一个file对象,再完成文件上传后需要将上传的文件信息保存到数据库中
            File file =File.builder()
                    .isDelete(false) //文件是否被删除
                    .size(multipartFile.getSize()) //文件大小
                    .contextType(multipartFile.getContentType()) //文件类型
                    .dataType(FileDataTypeUtil.getDataType(multipartFile.getContentType())) //数据类型
                    .submittedFileName(multipartFile.getOriginalFilename()) //原始文件名称
                    .ext(FilenameUtils.getExtension(multipartFile.getOriginalFilename())) //后缀名
                    .build();
            //设置文件的图标
            file.setIcon(IconType.getIcon(file.getExt()).getIcon() );

            //设置时间
            LocalDateTime now = LocalDateTime.now();
            file.setCreateMonth(DateUtils.formatAsYearMonthEn(now));
            file.setCreateWeek(DateUtils.formatAsYearWeekEn(now));
            file.setCreateDay(DateUtils.formatAsDateEn(now));

            //封装File对象相关属性
            uploadFile(file,multipartFile);

        return file;
        }catch (Exception e){
            log.error("e={}",e);
            throw BizException.wrap(ExceptionCode.BASE_VALID_PARAM.build("文件上传失败"));
        }
    }

    @Override
    public boolean delete(List<FileDeleteDO> list) {
        if(list==null||list.isEmpty()){
            return  true;
        }

        boolean flag=false; //删除操作是否成功的标识位
        for (FileDeleteDO fileDeleteDO : list) {
            try {
                delete(fileDeleteDO);
                flag=true;
            }catch (Exception e){
                log.error("e={}",e);
            }
        }
        return flag;
    }

    /**
     * 文件上传抽象方法,需要由当前类的子类实现
     * @param file
     * @param multipartFile
     * @return
     */
    public abstract File uploadFile(File file,MultipartFile multipartFile);

    /**
     * 文件删除抽象方法,需要当前类的子类来实现
     * @param fileDeleteDO
     */
    public abstract  void delete(FileDeleteDO fileDeleteDO);
}
